iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 7
0

本篇重點

.NET Core 提供 開發模式的Developer exception page Middleware

UseExceptionHandler 如何客製錯誤頁面


前言

ASP .NET Core 已有提供現成Exception Handler
在Startup.cs 一樣是使用Middleware 去註冊上去

在一開始建立 .NET Core Mvc 專案時
就可以看到Starup.cs有兩種Middleware

 if (env.IsDevelopment())
 {
   app.UseDeveloperExceptionPage();
 }
 else
 {
   app.UseExceptionHandler("/Home/Error");
   // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
   app.UseHsts();
 }
 

又主要可分為兩種

  1. Developer exception page Middleware
    由於開發版本需要看到比較詳細的錯誤,因此有提供一個UseDeveloperExceptionPage()的Middleware,公開發時使用

  2. UseExceptionHandler
    在正式版本通常不會需要太詳細的錯誤訊息,但會需要比較友善的顯示頁面,例如請聯絡管理員之類得等等,在這個方法就可以客制話錯誤頁面


UseDeveloperExceptionPage()

基本介紹

是 ASP .NET Core 提供的錯誤處理範本
在一開始新增專案的設定都會是dev環境(設定在launchSettings.json)
錯誤範本的畫面如下,一開始打開預設會是在Stack的頁籤

  1. 顯示錯誤的訊息,以及行數
  2. 提供5種的詳細內容
    • Stack : 主要錯誤訊息的頁面,提供詳細的log資訊
    • Query : 提供查詢的query 字串
    • Cookies : 此次發動查詢所記錄的cookies資訊
    • Headers : 紀錄client 發動查詢的headers
    • Routing :會紀錄發動查詢的router名稱,所使用到的action
  3. 錯誤訊息的log,以及錯誤的程式名稱
  4. 更詳細的錯誤訊息內容

DeveloperExceptionPageOptions

UseDeveloperExceptionPage 可以傳入一個DeveloperExceptionPageOptions 的物件,
DeveloperExceptionPageOptionsc 可以設定要顯示錯誤訊息的行數

startup.cs

if (env.IsDevelopment())
{
   DeveloperExceptionPageOptions developerExceptionPageOptions = new DeveloperExceptionPageOptions
   {
     SourceCodeLineCount = 4 //顯示的行數為錯誤那行的前後4行
   };
    app.UseDeveloperExceptionPage(developerExceptionPageOptions);
...
}


UseExceptionHandler

基本介紹

在Production 時,可以利用 UseExceptionHandler的Middleware
客製化我們的錯誤頁面
一開始建立專案範本時,已經就有建立個error的範本
在 statup.cs 下可以看到 production 會指向 HomeContriller 下 Error 的 action

startup.cs

app.UseExceptionHandler("/Home/Error");

在controller 的 index action 裡面拋出一個錯誤訊息
內建的專案就已經有 Error 的 action
範本還會多回傳一個ErrorModel, 裡面記錄的requestion id 的資訊
這裡先註解掉直接回傳一個view就好

Homecontroller.cs

範本的專案 Error 的 view 是建立在 Shared 資料夾下
MVC 去找View的時候會先從同個 HomeController 下找,找不到再往 Shared 去找 view ,所以在這邊還是可以成功的將錯誤頁面顯示出來

在這邊個人覺得根據專案範本 Error.cshtml 是放在共用檔
照理來說 startup.cs 的 router 不應該是在Home下面
甚至Error應該會是獨立出來的一個 Controller
router 應該直接設定成 /Error 比較合理


UseExceptionHandler,也可直接在裡面設定錯誤的訊息內容
也可以直接回傳一個json格式的內容

app.UseExceptionHandler(errorApp =>
{
  errorApp.Run(async context =>
  {
    context.Response.StatusCode = 500;
    context.Response.ContentType = "application/json";
                       
   var json = @"{ ""Message"": ""This is Error test."" }";
   await context.Response.WriteAsync(json);

    });
});


參考資料:
https://dotnettutorials.net/lesson/developer-exception-page-middleware-asp-net-core/

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/error-handling?view=aspnetcore-3.1#exception-handler-page-1

https://www.tutorialsteacher.com/core/aspnet-core-exception-handling

https://ithelp.ithome.com.tw/articles/10195894


上一篇
Day 6 Logging
下一篇
Day 8 Static File 靜態檔案
系列文
ASP.NET Core 入門實戰30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言